xiao jian cheng adds Mapbar support.
authorrobertlipe <robertlipe@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 28 Feb 2013 13:39:24 +0000 (13:39 +0000)
committerrobertlipe <robertlipe@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 28 Feb 2013 13:39:24 +0000 (13:39 +0000)
git-svn-id: http://gpsbabel.googlecode.com/svn/trunk@4329 f51c46e8-681c-474f-0cfe-069cfd0219fb

gpsbabel/Makefile.in
gpsbabel/mapbar_track.cc [new file with mode: 0644]
gpsbabel/reference/track/mapbar.trk [new file with mode: 0644]
gpsbabel/reference/track/mapbar~gpx.gpx [new file with mode: 0644]
gpsbabel/src/core/datetime.h
gpsbabel/testo.d/mapbar.test [new file with mode: 0644]
gpsbabel/vecs.cc

index 6d673b223fe59656e540b482f44600202529bace..98fb41dfe099d444338d80a032c77f9a946bc927 100644 (file)
@@ -83,7 +83,7 @@ ALL_FMTS=$(MINIMAL_FMTS) gtm.o gpsutil.o cetus.o copilot.o \
        pocketfms_bc.o pocketfms_fp.o pocketfms_wp.o naviguide.o enigma.o \
        vpl.o teletype.o jogmap.o bushnell.o bushnell_trl.o wintec_tes.o \
        subrip.o garmin_xt.o garmin_fit.o lowranceusr4.o \
-        mtk_locus.o googledir.o
+        mtk_locus.o googledir.o mapbar_track.o
 
 FMTS=@FMTS@
 
diff --git a/gpsbabel/mapbar_track.cc b/gpsbabel/mapbar_track.cc
new file mode 100644 (file)
index 0000000..da21a24
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+    China mapbar navigation track reader for sonim xp3300
+       it's maybe can used in other demo devices of mapbar navigation
+
+    Copyright (C) 2013 xiao jian cheng, azuresky.xjc@gmail.com
+    Copyright (C) 2001-2013 Robert Lipe, robertlipe@gpsbabel.org
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#include "defs.h"
+#include <QtCore/QDebug>
+
+#define MYNAME "mapbar_track"
+
+static gbfile* fin;
+
+static
+arglist_t mapbar_track_args[] = {
+  ARG_TERMINATOR
+};
+
+/*******************************************************************************
+* %%%        global callbacks called by gpsbabel main process              %%% *
+*******************************************************************************/
+
+static void
+mapbar_track_rd_init(const char* fname)
+{
+  fin = gbfopen(fname, "r", MYNAME);
+}
+
+static void
+mapbar_track_rd_deinit(void)
+{
+  gbfclose(fin);
+}
+
+static gpsbabel::DateTime
+read_time_t(void)
+{
+  int hour = gbfgetint16(fin);
+  int min = gbfgetint16(fin);
+  int sec = gbfgetint16(fin);
+  int year = gbfgetint16(fin);
+  int mon = gbfgetint16(fin);
+  int mday = gbfgetint16(fin);
+  gpsbabel::DateTime t(QDate(year, mon, mday), QTime(hour, min, sec));
+// qDebug() << t;
+  return t;
+}
+
+static const double DIV_RATE  = 100000.0f;
+static waypoint*
+read_waypoint(void)
+{
+  int longitude = gbfgetint32(fin);
+  int latitude = gbfgetint32(fin);
+
+  waypoint* ret = waypt_new();
+
+  ret->latitude = double(latitude)/DIV_RATE;
+  ret->longitude = double(longitude)/DIV_RATE;
+
+  return ret;
+}
+
+static void
+mapbar_track_read(void)
+{
+  route_head* track = route_head_alloc();
+  is_fatal((track == NULL), MYNAME ": memory non-enough");
+  track_add_head(track);
+
+  time_t start_time = read_time_t();
+  (void) start_time; // currently not used.
+  time_t end_time = read_time_t();
+  (void) end_time; // currently not used.
+
+  char name[200] = {0};
+  gbfread((void*)name, 1, 200, fin);
+  // At this point, name is a UCS-16 encoded, zero terminated string.
+  // All our internals use UTF-8 encoding, so convert now.
+  int olen = strlen(name);
+  track->rte_name = cet_str_uni_to_utf8((const short int*) name, olen);
+
+  waypoint* start = read_waypoint();
+  track_add_wpt(track, start);
+
+  waypoint* end = read_waypoint();
+
+  // skip one pair waypoint
+  gbfseek(fin, 4*4, SEEK_CUR);
+  // skip way length
+  gbfseek(fin, 8, SEEK_CUR);
+  // skip fixed value
+  gbfseek(fin, 4, SEEK_CUR);
+
+  int end_flag = gbfgetint32(fin);
+  for (;;) {
+    int length = gbfgetint32(fin);
+    is_fatal((length < 1) || (length > 1600), MYNAME ": get bad buffer length");
+
+    length += 16; // the real length
+    is_fatal((length % 8 != 0), MYNAME ": bad buffer size");
+
+    const int amount = length/8;
+    for (int i = 0; i < amount; ++i) {
+      waypoint* tmp = read_waypoint();
+      track_add_wpt(track, tmp);
+    }
+
+    if (end_flag) {
+      break;
+    }
+    end_flag = gbfgetint32(fin);
+  }
+
+  track_add_wpt(track, end);
+}
+
+// capabilities below means: we can only read trackpoints.
+
+ff_vecs_t mapbar_track_vecs = {
+  ff_type_file,
+  { ff_cap_none, (ff_cap)(ff_cap_read), ff_cap_none },
+  mapbar_track_rd_init,
+  NULL,
+  mapbar_track_rd_deinit,
+  NULL,
+  mapbar_track_read,
+  NULL,
+  NULL,
+  mapbar_track_args,
+  CET_CHARSET_UTF8, 0
+  /* not fixed, can be changed through command line parameter */
+};
diff --git a/gpsbabel/reference/track/mapbar.trk b/gpsbabel/reference/track/mapbar.trk
new file mode 100644 (file)
index 0000000..c08ca5d
Binary files /dev/null and b/gpsbabel/reference/track/mapbar.trk differ
diff --git a/gpsbabel/reference/track/mapbar~gpx.gpx b/gpsbabel/reference/track/mapbar~gpx.gpx
new file mode 100644 (file)
index 0000000..cf39daa
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx 
+  version="1.0" 
+  creator="GPSBabel - http://www.gpsbabel.org" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+  xmlns="http://www.topografix.com/GPX/1/0" 
+  xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+  <time>1970-01-01T00:00:00Z</time>
+  <bounds minlat="23.170610000" minlon="113.295130000" maxlat="23.175130000" maxlon="113.297530000"/>
+  <trk>
+    <name>山顶到豆腐花</name>
+    <trkseg>
+      <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+      <trkpt lat="23.170610000" lon="113.295130000">
+</trkpt>
+      <trkpt lat="23.175130000" lon="113.297530000">
+</trkpt>
+      <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+      <trkpt lat="23.175130000" lon="113.295240000">
+</trkpt>
+      <trkpt lat="23.175090000" lon="113.295350000">
+</trkpt>
+      <trkpt lat="23.175040000" lon="113.295530000">
+</trkpt>
+      <trkpt lat="23.174980000" lon="113.295640000">
+</trkpt>
+      <trkpt lat="23.174940000" lon="113.295740000">
+</trkpt>
+      <trkpt lat="23.174850000" lon="113.295850000">
+</trkpt>
+      <trkpt lat="23.174760000" lon="113.295940000">
+</trkpt>
+      <trkpt lat="23.174620000" lon="113.295980000">
+</trkpt>
+      <trkpt lat="23.174460000" lon="113.296010000">
+</trkpt>
+      <trkpt lat="23.174360000" lon="113.296030000">
+</trkpt>
+      <trkpt lat="23.174200000" lon="113.296060000">
+</trkpt>
+      <trkpt lat="23.174120000" lon="113.296120000">
+</trkpt>
+      <trkpt lat="23.174030000" lon="113.296200000">
+</trkpt>
+      <trkpt lat="23.173940000" lon="113.296390000">
+</trkpt>
+      <trkpt lat="23.173890000" lon="113.296500000">
+</trkpt>
+      <trkpt lat="23.173820000" lon="113.296600000">
+</trkpt>
+      <trkpt lat="23.173720000" lon="113.296570000">
+</trkpt>
+      <trkpt lat="23.173630000" lon="113.296520000">
+</trkpt>
+      <trkpt lat="23.173520000" lon="113.296480000">
+</trkpt>
+      <trkpt lat="23.173380000" lon="113.296490000">
+</trkpt>
+      <trkpt lat="23.173260000" lon="113.296490000">
+</trkpt>
+      <trkpt lat="23.173120000" lon="113.296480000">
+</trkpt>
+      <trkpt lat="23.172940000" lon="113.296470000">
+</trkpt>
+      <trkpt lat="23.172790000" lon="113.296510000">
+</trkpt>
+      <trkpt lat="23.172670000" lon="113.296560000">
+</trkpt>
+      <trkpt lat="23.172580000" lon="113.296660000">
+</trkpt>
+      <trkpt lat="23.172500000" lon="113.296800000">
+</trkpt>
+      <trkpt lat="23.172410000" lon="113.296940000">
+</trkpt>
+      <trkpt lat="23.172320000" lon="113.297080000">
+</trkpt>
+      <trkpt lat="23.172230000" lon="113.297170000">
+</trkpt>
+      <trkpt lat="23.172120000" lon="113.297250000">
+</trkpt>
+      <trkpt lat="23.172030000" lon="113.297330000">
+</trkpt>
+      <trkpt lat="23.171930000" lon="113.297460000">
+</trkpt>
+      <trkpt lat="23.171820000" lon="113.297530000">
+</trkpt>
+      <trkpt lat="23.171870000" lon="113.297370000">
+</trkpt>
+      <trkpt lat="23.171960000" lon="113.297280000">
+</trkpt>
+      <trkpt lat="23.172040000" lon="113.297180000">
+</trkpt>
+      <trkpt lat="23.172090000" lon="113.297060000">
+</trkpt>
+      <trkpt lat="23.172170000" lon="113.296920000">
+</trkpt>
+      <trkpt lat="23.172230000" lon="113.296790000">
+</trkpt>
+      <trkpt lat="23.172270000" lon="113.296660000">
+</trkpt>
+      <trkpt lat="23.172290000" lon="113.296520000">
+</trkpt>
+      <trkpt lat="23.172250000" lon="113.296380000">
+</trkpt>
+      <trkpt lat="23.172240000" lon="113.296240000">
+</trkpt>
+      <trkpt lat="23.172230000" lon="113.296110000">
+</trkpt>
+      <trkpt lat="23.172140000" lon="113.296020000">
+</trkpt>
+      <trkpt lat="23.172050000" lon="113.296120000">
+</trkpt>
+      <trkpt lat="23.172060000" lon="113.296240000">
+</trkpt>
+      <trkpt lat="23.172090000" lon="113.296360000">
+</trkpt>
+      <trkpt lat="23.172120000" lon="113.296470000">
+</trkpt>
+      <trkpt lat="23.172130000" lon="113.296610000">
+</trkpt>
+      <trkpt lat="23.172100000" lon="113.296710000">
+</trkpt>
+      <trkpt lat="23.172050000" lon="113.296820000">
+</trkpt>
+      <trkpt lat="23.171960000" lon="113.296920000">
+</trkpt>
+      <trkpt lat="23.171860000" lon="113.297010000">
+</trkpt>
+      <trkpt lat="23.171750000" lon="113.297100000">
+</trkpt>
+      <trkpt lat="23.171580000" lon="113.297170000">
+</trkpt>
+      <trkpt lat="23.171450000" lon="113.297250000">
+</trkpt>
+      <trkpt lat="23.171310000" lon="113.297270000">
+</trkpt>
+      <trkpt lat="23.171170000" lon="113.297300000">
+</trkpt>
+      <trkpt lat="23.171010000" lon="113.297210000">
+</trkpt>
+      <trkpt lat="23.170850000" lon="113.297170000">
+</trkpt>
+      <trkpt lat="23.170750000" lon="113.297140000">
+</trkpt>
+      <trkpt lat="23.170610000" lon="113.297100000">
+</trkpt>
+      <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+      <trkpt lat="23.170640000" lon="113.295130000">
+</trkpt>
+      <trkpt lat="23.175110000" lon="113.296990000">
+</trkpt>
+      <trkpt lat="23.175110000" lon="113.295130000">
+</trkpt>
+      <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+      <trkpt lat="23.170640000" lon="113.296990000">
+</trkpt>
+    </trkseg>
+</trk>
+</gpx>
index c62baa408d0eeb60fd13fe217ac962ccb6507b1b..9aad0368db11c2a5f81736274ba9f561830aeba6 100644 (file)
@@ -43,6 +43,9 @@ public:
     t_ = -1;
   }
 
+  DateTime(QDate date, QTime time) : QDateTime(date, time) { }
+
+
   // Handle time_tm tm = wpt->creation_time;
   operator const time_t() const  {
     return this->toTime_t();
diff --git a/gpsbabel/testo.d/mapbar.test b/gpsbabel/testo.d/mapbar.test
new file mode 100644 (file)
index 0000000..a91ac06
--- /dev/null
@@ -0,0 +1,4 @@
+# Mapbar/Sonim XP330
+rm -f ${TMPDIR}/mapbar.gpx
+gpsbabel -i mapbar -f ${REFERENCE}/track/mapbar.trk -o gpx -F ${TMPDIR}/mapbar.gpx
+compare ${REFERENCE}/track/mapbar~gpx.gpx ${TMPDIR}/mapbar.gpx 
index 6ee045ad7ca923688b8104d17685807508852485..55d30e4db45b0d605c326403923d0113406bbc2e 100644 (file)
@@ -179,6 +179,7 @@ extern ff_vecs_t wintec_tes_vecs;
 extern ff_vecs_t subrip_vecs;
 extern ff_vecs_t format_garmin_xt_vecs;
 extern ff_vecs_t format_fit_vecs;
+extern ff_vecs_t mapbar_track_vecs;
 
 static
 vecs_t vec_list[] = {
@@ -1067,6 +1068,12 @@ vecs_t vec_list[] = {
     "Flexible and Interoperable Data Transfer (FIT) Activity file"
     "fit"
   },
+  {
+    &mapbar_track_vecs,
+    "mapbar",
+    "Mapbar (China) navigation track for Sonim Xp3300",
+    "trk"
+  },
 #endif // MAXIMAL_ENABLED
   {
     NULL,